package ma.moliere.domaine.impl;

import java.io.Serializable;
import java.util.Calendar;
import java.util.List;

import ma.moliere.commun.FonctionnelleException;
import ma.moliere.domaine.IGestionInscriptionDomaine;
import ma.moliere.persistance.IElevePersistance;
import ma.moliere.persistance.IGestionInscriptionPersistance;
import ma.moliere.persistance.IParametragePersistance;
import ma.moliere.persistance.oe.CompteurGroupe;
import ma.moliere.persistance.oe.Inscription;
import ma.moliere.persistance.oe.Rencontre;
import ma.moliere.transverse.utils.Configuration;
import ma.moliere.transverse.vo.ClasseAffichee;
import ma.moliere.transverse.vo.EleveAffiche;
import ma.moliere.transverse.vo.ReglementAffiche;

import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
public class GestionInscriptionDomaineImpl implements IGestionInscriptionDomaine, Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -8166796741620387044L;

	private Configuration config;
	private IGestionInscriptionPersistance persistance;
	private IParametragePersistance parametragePersistance;
	private IElevePersistance elevePersistance;

	@Transactional(readOnly = false)
	@Override
	public void modifier(final Inscription inscription) {
		// TODO Auto-generated method stub

	}

	@Override
	public List < ReglementAffiche > rechercherReglements(final List < Long > ids) {
		return persistance.rechercherReglements(ids);
	}

	public void setPersistance(final IGestionInscriptionPersistance persistance) {
		this.persistance = persistance;
	}

	public void setParametragePersistance(final IParametragePersistance parametragePersistance) {
		this.parametragePersistance = parametragePersistance;
	}

	public void setElevePersistance(final IElevePersistance elevePersistance) {
		this.elevePersistance = elevePersistance;
	}

	@Override
	public Long compterEleves() {

		return elevePersistance.compterEleves();
	}

	@Override
	public List < Inscription > rechercherInscription(final List < String > matricules, final long idannee) {
		return persistance.rechercherInscription(matricules, idannee);
	}

	@Transactional(readOnly = false)
	@Override
	public void modifierReglement(final ReglementAffiche reglement) {
		persistance.modifierReglement(reglement);

	}

	@Transactional(readOnly = false)
	@Override
	public void ajouterRencontre(final Rencontre rencontre) {
		persistance.ajouterRencontre(rencontre);

	}

	@Transactional(readOnly = false)
	@Override
	public Inscription enregistrerInscription(final Inscription inscription, final long idAnneescolaire, final long idClasse,
		final EleveAffiche eleve) throws FonctionnelleException {

		Inscription inscriptionCree = null;
		if (inscription.getId() == null) {

			// On enregistre l'élève sans matricule.
			EleveAffiche elevecree = elevePersistance.ajouter(eleve);
			CompteurGroupe compteurgrp = parametragePersistance.incrementerCompteurGroupe(new CompteurGroupe());
			ClasseAffichee classe = parametragePersistance.rechercherClasseParId(idClasse);
			// on calcul la matriule sur la base de l'ID de l'élève
			if (elevecree.getMatricule() == null) {
				if (elevecree.getId() < Long.valueOf(10)) {
					// FROMAT = AAAA0009
					elevecree.setMatricule("" + (Calendar.getInstance()).get(Calendar.YEAR) + "000" + elevecree.getId());
				} else if (elevecree.getId() >= Long.valueOf(10) && elevecree.getId() < Long.valueOf(100)) {
					// FROMAT = AAAA0999
					elevecree.setMatricule("" + (Calendar.getInstance()).get(Calendar.YEAR) + "00" + elevecree.getId());
				} else if (elevecree.getId() >= Long.valueOf(100) && elevecree.getId() < Long.valueOf(1000)) {
					// FROMAT = AAAA0999
					elevecree.setMatricule("" + (Calendar.getInstance()).get(Calendar.YEAR) + "0" + elevecree.getId());
				} else {
					elevecree.setMatricule("" + Calendar.YEAR + elevecree.getId());
					elevecree.setMatricule("" + (Calendar.getInstance()).get(Calendar.YEAR) + elevecree.getId());
				}
			}
			// Persistance de la matricule
			elevecree = elevePersistance.modifier(elevecree);
			// Preparation des données de l'inscription

			inscription.setClasse(idClasse);
			inscription.setAnneescolaire(idAnneescolaire);
			inscription.setNomeleve(elevecree.getNom());
			inscription.setPrenomeleve(elevecree.getPrenom());
			inscription.setMatricule(elevecree.getMatricule());
			Long groupe = Long.valueOf((long) Math.ceil(compteurgrp.getId() / Double.valueOf(classe.getTaille())));
			if (groupe > classe.getNombregroupe()) {
				elevePersistance.supprimer(elevecree.getId());
				throw new FonctionnelleException(" L'inscription ne peut pas être faite. Les groupes sont pleins.");
			}
			inscription.setGroupe(groupe);
			inscriptionCree = persistance.ajouter(inscription);
		} else {
			inscriptionCree = persistance.modifier(inscription);
		}

		return inscriptionCree;

	}

	@Override
	public List < Inscription > rechercherInscriptionParClasseGrpsEtAnnees(final List < Long > idsClasse,
		final List < Long > idsgrp, final List < Long > idsAnnee) {
		return persistance.rechercherInscriptionParClasseGrpsEtAnnees(idsClasse, idsgrp, idsAnnee);
	}

	@Override
	public ReglementAffiche ajouterReglement(final ReglementAffiche reglement) {
		return persistance.ajouterReglement(reglement);
	}

	@Override
	public List < ReglementAffiche > rechercherReglementsParInscription(final List < Long > ids) {
		return persistance.rechercherReglementsParInscription(ids);
	}

	public void setConfig(final Configuration config) {
		this.config = config;
	}

}
